const express = require('express');
const router = express.Router();
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const { File } = require('../models/file');
const { Task } = require('../models/task');

// 配置 multer 存储
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    // 按年月创建目录
    const now = new Date();
    const year = now.getFullYear();
    const month = String(now.getMonth() + 1).padStart(2, '0');
    const dir = path.join(__dirname, '..', '..', 'uploads', year.toString(), month);
    
    // 确保目录存在
    fs.mkdirSync(dir, { recursive: true });
    cb(null, dir);
  },
  filename: function (req, file, cb) {
    // 解决文件名乱码问题
    const originalname = Buffer.from(file.originalname, 'latin1').toString('utf8');
    // 生成文件名：时间戳 + 原始文件名
    const timestamp = Date.now();
    const filename = `${timestamp}-${originalname}`;
    cb(null, filename);
  }
});

const upload = multer({ storage: storage });

// 上传文件
router.post('/upload', upload.single('file'), async (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({ message: '没有上传文件' });
    }

    // 解决文件名乱码
    const originalname = Buffer.from(req.file.originalname, 'latin1').toString('utf8');
    
    // 获取文件扩展名
    const ext = path.extname(originalname).toLowerCase();
    
    // 根据扩展名设置文件类型
    let fileType;
    switch (ext) {
      case '.pdf':
        fileType = 'application/pdf';
        break;
      case '.jpg':
      case '.jpeg':
        fileType = 'image/jpeg';
        break;
      case '.png':
        fileType = 'image/png';
        break;
      case '.docx':
        fileType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
        break;
      default:
        return res.status(400).json({ message: '不支持的文件格式' });
    }

    // 创建文件记录
    const file = await File.create({
      name: req.file.filename,
      originalName: originalname,
      path: req.file.path,
      size: req.file.size,
      type: fileType
    });

    res.json(file);
  } catch (error) {
    console.error('文件上传失败:', error);
    res.status(500).json({ message: '文件上传失败' });
  }
});

// 删除文件
router.delete('/:fileId', async (req, res) => {
  try {
    const file = await File.findByPk(req.params.fileId);

    if (!file) {
      return res.status(404).json({ error: '文件不存在' });
    }

    // 保存文件路径用于后续删除
    const filePath = file.path;

    // 1. 删除相关的任务记录
    await Task.destroy({
      where: { fileId: file.id }
    });

    // 2. 删除文件记录
    await file.destroy();

    // 3. 删除物理文件
    try {
      await fs.promises.unlink(filePath);
    } catch (err) {
      console.error('删除物理文件失败:', err);
      // 继续执行，不影响整体删除流程
    }

    res.status(200).json({ message: '删除成功' });
  } catch (error) {
    console.error('删除文件失败:', error);
    res.status(500).json({ error: '删除文件失败，请重试' });
  }
});

module.exports = router; 